Атака оглушением вызывает подобную ерунду. Да и не только.
Например в доте бы вылетало сообщение 0 при атаке имея МКБ - сообщался бы урон, урон от микробаша, если бы выпал и 0.00 от нулевого критического удара.
Решение простое - поставь условие, что полученный урон больше 0.00, тогда только выводить.
UniverseRuler, в доте 6-6 использованы игроки 13 и 14
тебе нужно просто сохранять приказ отданный триггерно(ты ведь ими будешь юнитами управлять)
и восстанавливать его при получение приказа для игрока
для этого нужна буленовская переменная для определения триггерный это приказ или нет
и структура/хэш/юзердата для сохранения приказа UniverseRuler:
еще остались асы картостроения, но а сейчас начинаю думать, что их все таки нету
если ас картостроения это человек который воплощает все ваши фантазии в жизнь то тут таких нету и не было
ещё можно создавать всех юнитов за 1 резервного игрока
а автоатаку делать триггерно
этот вариант самый лучший но то просто не сможешь его сделать
ибо нужны джасс+алгоритмы+структуры/хэш
а ты судя по всему ничего из этого не знаешь
pro100master, но ведь это собьет и его текущие приказы?
Upd.:Я понял в чем проблема.
Я хочу чтоб можно было использовать способности юнита, при этом чтоб были недоступны атака/перемещение итд., а ведь это тоже его способности...
Короче я загнал себя в угол.
Пожалуй пойду по пути создания торговца-здания.
Но если у кого есть решение моей дилемы - буду рад!
после разложения костей юниты сами выгружаются из памяти
функция "wait" то же вызывает утечки
она не вызывает утечки, она сама по себе кривая и не подходит под большинство задач
если создать переменную "Point" типа "точка" и изначально задать ей положение центр области "Final", а потом обращаться уже к этой переменной "Point" в триггере событие "боевая единица входит в область "Start", действие "отдать приказ боевой единице следовать в "Point" , то новые точки создаваться не будут?
да
только в гуи еще и создание юнитов утекает тоже насколько я помню, надо тоже заранее точку делать
впринципе можно было бы обойтись одной точкой на все действия, но вам видимо пока рано
pro100master, но ведь это собьет и его текущие приказы?
Upd.:Я понял в чем проблема.
Я хочу чтоб можно было использовать способности юнита, при этом чтоб были недоступны атака/перемещение итд., а ведь это тоже его способности...
Короче я загнал себя в угол.
Пожалуй пойду по пути создания торговца-здания.
Но если у кого есть решение моей дилемы - буду рад!
GRESHNIK1, ошибку вызывает каждая из 3 моделей?
или лишь 1 из них?
ну а вообще критует из за того что модель кривая
либо брось это дело либо сконверти их в mdl и правь через блокнот
Кто-то объяснит почему 36 символьная система? можно использовать разные case написания ещё ведь. Да и еще кучу других символов. Почему именно 36, непонятно.. theGCI, NickIAm тебе вроде нормальный гайд выложил, там доступно написано. NickIAm:
function SaveLoad_InitialSetup takes nothing returns nothing
local integer i = 0
local integer j = 0
loop
set udg_SaveLoad_Compress[i + 48] = j
set udg_SaveLoad_Uncompress[i] = i + 48
set j = j + 1
set i = i + 1
exitwhen i >= 10
endloop
set i = 0
loop
set udg_SaveLoad_Compress[i + 97] = j
set udg_SaveLoad_Compress[i + 65] = j + 26
set udg_SaveLoad_Uncompress[i + 10] = i + 97
set udg_SaveLoad_Uncompress[i + 26 + 10] = i + 65
set j = j + 1
set i = i + 1
exitwhen i >= 26
endloop
endfunction
function SaveLoad_Id2CId takes integer n returns integer
local integer i = n / (256 * 256 * 256)
local integer r
set n = n - i * (256 * 256 * 256)
set r = udg_SaveLoad_Compress[i]
set i = n / (256 * 256)
set n = n - i * (256 * 256)
set r = r * 64 + udg_SaveLoad_Compress[i]
set i = n / 256
set r = r * 64 + udg_SaveLoad_Compress[i]
return r * 64 + udg_SaveLoad_Compress[n - i * 256]
endfunction
function SaveLoad_CId2Id takes integer n returns integer
local integer i = n / (64 * 64 * 64)
local integer r
set n = n - i * (64 * 64 * 64)
set r = udg_SaveLoad_Uncompress[i]
set i = n / (64 * 64)
set n = n - i * (64 * 64)
set r = r * 256 + udg_SaveLoad_Uncompress[i]
set i = n / 64
set r = r * 256 + udg_SaveLoad_Uncompress[i]
return r * 256 + udg_SaveLoad_Uncompress[n - i * 64]
endfunction
function SaveLoad_Unit2Integer takes unit u returns integer
local integer i = 0
local integer n = GetUnitTypeId(u)
if udg_SaveLoad_Initialized == false then
set udg_SaveLoad_Initialized = true
call SaveLoad_InitialSetup()
endif
loop
set i = i + 1
exitwhen i > udg_SaveLoad_Heroes_LastIndex
if udg_SaveLoad_Heroes[i] == n then
return i
endif
endloop
return SaveLoad_Id2CId(n)
endfunction
function SaveLoad_Integer2Unit takes integer i returns integer
if udg_SaveLoad_Initialized == false then
set udg_SaveLoad_Initialized = true
call SaveLoad_InitialSetup()
endif
if i <= udg_SaveLoad_Heroes_LastIndex then
return udg_SaveLoad_Heroes[i]
endif
return SaveLoad_CId2Id(i)
endfunction
function SaveLoad_Item2Integer takes item t returns integer
local integer i = 0
local integer n = GetItemTypeId(t)
if udg_SaveLoad_Initialized == false then
set udg_SaveLoad_Initialized = true
call SaveLoad_InitialSetup()
endif
loop
set i = i + 1
exitwhen i > udg_SaveLoad_Items_LastIndex
if udg_SaveLoad_Items[i] == n then
return i
endif
endloop
return SaveLoad_Id2CId(n)
endfunction
function SaveLoad_Integer2Item takes integer i returns integer
if udg_SaveLoad_Initialized == false then
set udg_SaveLoad_Initialized = true
call SaveLoad_InitialSetup()
endif
if i <= udg_SaveLoad_Items_LastIndex then
return udg_SaveLoad_Items[i]
endif
return SaveLoad_CId2Id(i)
endfunction
function SaveLoad_Ability2Integer takes integer a returns integer
local integer i = 0
if udg_SaveLoad_Initialized == false then
set udg_SaveLoad_Initialized = true
call SaveLoad_InitialSetup()
endif
loop
set i = i + 1
exitwhen i > udg_SaveLoad_Abilities_LastIndex
if udg_SaveLoad_Abilities[i] == a then
return i
endif
endloop
return SaveLoad_Id2CId(a)
endfunction
function SaveLoad_Integer2Ability takes integer i returns integer
if udg_SaveLoad_Initialized == false then
set udg_SaveLoad_Initialized = true
call SaveLoad_InitialSetup()
endif
if i <= udg_SaveLoad_Abilities_LastIndex then
return udg_SaveLoad_Abilities[i]
endif
return SaveLoad_CId2Id(i)
endfunction
function SaveLoad_Color takes string s returns string
local integer i = StringLength(s)
local string c
local string r = ""
loop
set i = i - 1
set c = SubString(s,i,i + 1)
if c == "0" or c == "1" or c == "2" or c == "3" or c == "4" or c == "5" or c == "6" or c == "7" or c == "8" or c == "9" then
set r = "|cffffcc00" + c + "|r" + r
elseif c == "-" then
set r = "|cffdddddd-|r" + r
elseif c == "a" or c == "b" or c == "c" or c == "d" or c == "e" or c == "f" or c == "g" or c == "h" or c == "i" or c == "j" or c == "k" or c == "l" or c == "m" or c == "n" or c == "o" or c == "p" or c == "q" or c == "r" or c == "s" or c == "t" or c == "u" or c == "v" or c == "w" or c == "x" or c == "y" or c == "z" then
set r = "|cff00cc00" + c + "|r" + r
elseif c == "A" or c == "B" or c == "C" or c == "D" or c == "E" or c == "F" or c == "G" or c == "H" or c == "I" or c == "J" or c == "K" or c == "L" or c == "M" or c == "N" or c == "O" or c == "P" or c == "Q" or c == "R" or c == "S" or c == "T" or c == "U" or c == "V" or c == "W" or c == "X" or c == "Y" or c == "Z" then
set r = "|cff3399ff" + c + "|r" + r
else
set r = c + r
endif
exitwhen i <= 0
endloop
return r
endfunction
function SaveLoad_EncodeChar takes string n returns integer
local integer i = 0
local string s1 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
local string s2 = "abcdefghijklmnopqrstuvwxyz"
local string s3 = "0123456789"
loop
if SubString(s1,i,i + 1) == n then
return i
endif
if SubString(s2,i,i + 1) == n then
return i
endif
set i = i + 1
exitwhen i >= 26
endloop
set i = 0
loop
if SubString(s3,i,i + 1) == n then
return i
endif
set i = i + 1
exitwhen i >= 10
endloop
return 0
endfunction
function SaveLoad_EncodeVerify takes string buffer returns integer
local integer i = 0
local integer j = 0
local string name = GetPlayerName(GetTriggerPlayer())
if udg_SaveLoad_UsePlayername == true then
loop
set j = j + SaveLoad_EncodeChar(SubString(name,i,i + 1))
set i = i + 1
exitwhen i >= StringLength(name)
endloop
endif
set i = 0
loop
set j = j + SaveLoad_EncodeChar(SubString(buffer,i,i + 1))
set i = i + 1
exitwhen i >= StringLength(buffer)
endloop
return j
endfunction
function SaveLoad_EncodeValues takes nothing returns string
local integer i
local integer j
local integer k
local integer l
local integer m
local integer CodeLength = StringLength(udg_SaveLoad_Alphabet)
local integer array a
local string buffer = ""
local string c = ""
local integer skip = 0
local integer CONST = 1000000
local string abc = "0123456789"
set i = 0
loop
set i = i + 1
exitwhen i > udg_SaveCount
set buffer = buffer + I2S(udg_Save[i]) + "-"
endloop
set buffer = buffer + I2S(SaveLoad_EncodeVerify(buffer))
if udg_Save[1] == 0 then
set buffer = "-" + buffer
endif
set i = 0
loop
set a[i] = 0
set i = i + 1
exitwhen i >= 100
endloop
set m = 0
set i = 0
loop
set j = 0
loop
set a[j] = a[j] * 11
set j = j + 1
exitwhen j > m
endloop
set l = 0
set c = SubString(buffer,i,i + 1)
loop
exitwhen SubString(abc,l,l + 1) == c
set l = l + 1
exitwhen l > 9
endloop
set a[0] = a[0] + l
set j = 0
loop
set k = a[j] / CONST
set a[j] = a[j] - k * CONST
set a[j + 1] = a[j + 1] + k
set j = j + 1
exitwhen j > m
endloop
if k > 0 then
set m = m + 1
endif
set i = i + 1
exitwhen i >= StringLength(buffer)
endloop
set buffer = ""
loop
exitwhen m < 0
set j = m
loop
exitwhen j <= 0
set k = a[j] / CodeLength
set a[j - 1] = a[j - 1] + (a[j] - k * CodeLength) * CONST
set a[j] = k
set j = j - 1
endloop
set k = a[j] / CodeLength
set i = a[j] - k * CodeLength
set buffer = buffer + SubString(udg_SaveLoad_Alphabet,i,i + 1)
set a[j] = k
if a[m] == 0 then
set m = m - 1
endif
endloop
set i = StringLength(buffer)
set skip = 0
set c = ""
loop
set i = i - 1
set c = c + SubString(buffer,i,i + 1)
set skip = skip + 1
if skip == 4 and i > 0 then
set c = c + "-"
set skip = 0
endif
exitwhen i <= 0
endloop
return c
endfunction
function SaveLoad_DecodeValues takes string s returns boolean
local integer i
local integer j
local integer k
local integer l
local integer SaveCode = 0
local integer m
local integer array a
local string buffer = ""
local integer CodeLength = StringLength(udg_SaveLoad_Alphabet)
local integer skip = -1
local integer CONST = 1000000
local string abc = "0123456789-"
local string c
set i = 0
loop
set a[i] = 0
set i = i + 1
exitwhen i >= 100
endloop
set m = 0
set i = 0
loop
set j = 0
loop
set a[j] = a[j] * CodeLength
set j = j + 1
exitwhen j > m
endloop
set skip = skip + 1
if skip == 4 then
set skip = 0
set i = i + 1
endif
set l = CodeLength
set c = SubString(s,i,i + 1)
loop
set l = l - 1
exitwhen l < 1
exitwhen SubString(udg_SaveLoad_Alphabet,l,l + 1) == c
endloop
set a[0] = a[0] + l
set j = 0
loop
set k = a[j] / CONST
set a[j] = a[j] - k * CONST
set a[j + 1] = a[j + 1] + k
set j = j + 1
exitwhen j > m
endloop
if k > 0 then
set m = m + 1
endif
set i = i + 1
exitwhen i >= StringLength(s)
endloop
loop
exitwhen m < 0
set j = m
loop
exitwhen j <= 0
set k = a[j] / 11
set a[j - 1] = a[j - 1] + (a[j] - k * 11) * CONST
set a[j] = k
set j = j - 1
endloop
set k = a[j] / 11
set i = a[j] - k * 11
set buffer = SubString(abc,i,i + 1) + buffer
set a[j] = k
if a[m] == 0 then
set m = m - 1
endif
endloop
set i = 0
set j = 0
loop
loop
exitwhen i >= StringLength(buffer)
exitwhen i > 0 and SubString(buffer,i,i + 1) == "-" and SubString(buffer,i - 1,i) != "-"
set i = i + 1
endloop
if i < StringLength(buffer) then
set k = i
endif
set SaveCode = SaveCode + 1
set udg_Save[SaveCode] = S2I(SubString(buffer,j,i))
set j = i + 1
set i = i + 1
exitwhen i >= StringLength(buffer)
endloop
set j = SaveLoad_EncodeVerify(SubString(buffer,0,k))
set udg_SaveCount = SaveCode - 1
if j == udg_Save[SaveCode] then
return true
endif
return false
endfunction
function SaveLoad_Encode takes nothing returns string
if udg_SaveLoad_CaseSensitive == false then
set udg_SaveLoad_Alphabet = StringCase(udg_SaveLoad_Alphabet,true)
endif
return SaveLoad_Color(SaveLoad_EncodeValues())
endfunction
function SaveLoad_Decode takes string s returns boolean
if udg_SaveLoad_CaseSensitive == false then
set udg_SaveLoad_Alphabet = StringCase(udg_SaveLoad_Alphabet,true)
set s = StringCase(s,true)
endif
if SaveLoad_DecodeValues(s) then
call DisplayTextToPlayer(GetTriggerPlayer(),0,0,"")
return true
endif
call DisplayTextToPlayer(GetTriggerPlayer(),0,0,"Decoding failed")
return false
endfunction
Событие - Юнит заходит в область
Условие - Входящий юнит = (необходимый юнит)
Действие - Включить режим кинематики (скрыть интерфейс), и так далее...
Выключить этот триггер (чтобы не повторялось сначала)
Это жесть, что ты сделал) Этот русификатор триггеров уж такую муть содержит, что ты просто какую-то белиберду сотворил. Исправил до рабочего вида, но чтобы совсем красиво было, это не ко мне, а к джассерам. Просто времени мало на всё, а исправление этих триггеров затратило его довольно много.
от точки, которая создается, не используется, но удаляется
пика группы юнитов, которые все суммарно сколько их на карте нанесут бедной цели урон
и до атакованного юнита, которого вообще здесь не может быть)
что по сути, так я хз как можно прозевать "Цель способности", или как оно у вас называется в русифицированных триггерах. на стандартной версии это target of ability being cast
цикл здесь скорее всего не нужен, если конечно только смысл действительно в том что бы брать всех огров на карте и наносить цели урон.
Чтобы иметь и модель с обычной текстурой и с другой, с помощью программы для извлечения моделей из Warcraft 3 (я пользуюсь обычно Warcraft 3 Viewer, поищи на сайте), там ищешь справа в папках твою модель, извлекаешь её к себе на компьютер.
Потом открываешь программой mdlvis (основная программа для моделлинга, тоже здесь есть) модель, сразу выделяешь её и нажимаешь кнопку UV-карты или модули - редактор текстур.
Внизу есть путь для текстуры, измени на название скачанной. Нажми enter, сохрани модель.
Если текстура специально для той модели, переходи к следующему пункту.
Кинь текстуру и модель в папку с вариком и открывай WE. У тебя стандартная модель и модель с другой текстурой.
Возможно, звучит сложно, но я привык, несколько кликов - и текстура изменена.
создавайте новых юнитов ручками это будет быстрее чем вы изучите мемхак и поймёте как использовать функцию смены модели
function ChangeUnitModelTo takes unit u, string modelpath returns nothing
local integer a
local integer s
call MakeModelAsDefault(u,modelpath)
set LastConvertedHandle=ConvertHandle(u)
if LastConvertedHandle>0 then
set a=RMem(LastConvertedHandle)+0x88
if a>0 then
set a=RMem(a)
if a>0 then
set s=GetStringAddress(modelpath)
call CallThisCallWith3Args(a,LastConvertedHandle,s,1)
endif
endif
endif
endfunction
function ChangeUnitPortraitTo takes unit u, string modelpath returns nothing
set LastConvertedHandle=ConvertHandle(u)
if LastConvertedHandle>0 then
call CallThisCallWith3Args(GameDLL+0x33ADC0,LastConvertedHandle,GetStringAddress(modelpath),1)
endif
endfunction
В карте про сларков таком способом меняется модель лягушки после эволюции
Хозяин Миров, для начала прочитать весь список функций
или научится юзать поиск по функциям
ибо GetRandomInt(n,m)
где n начало промежутка из которого берутся числа а m конец
Каждый вопрос заслуживает отдельного обсуждения, а на все стало лень ответ печатать, когда начал.
Печатать реально долго, легче было реализовать примеры в карте:
Кроме последнего пункта, его нужно персонально рассматривать, так как игра не подразумевает использование для юнита двух списков. Например, можно наполнить список построек у юнита всеми зданиями, часть из которых блокировать при открытии одного списка и разблокировать при открытии второго, но это подходит, когда один рабочий. Можно сделать второй список из книги заклинаний, куда добавлены способности на основе игрушечных строений, чтобы было видно карту пути и всё такое, но там для них используется один приказ, то есть всегда одинаковое здание будет при нажатии на любую способность, а ещё нет стоимости золота и дерева, что тоже придётся как-то ваять триггерно. Можно перевоплощать юнита при смене списка в другого, но там тоже сложности, не помню точно какие, вроде бы связаны с расой, так как все строят по-разному.
С точкой сбора всё просто. Способность у игрока не заблокировать, потому нужно забрать её у всех зданий, которые есть на карте, либо будут построены.
Группа из максимум 9 юнитов работает немножко коряво, ранее мы с PT153 находили какой-то вариант, чтобы работало быстро, но лень пользоваться поиском. Вроде каждую 0.01 секунду проверялось количество выбранных юнитов, лишние удалялись из выбора.
Чтобы не было очереди, пришёл в голову лишь вариант с апгрейдом здания. Но у меня реализован просто пример для одного конкретного здания, а для нескольких абстрактных зданий нужно делать текстовым триггером, который будет для каждого здания запускать локальный таймер на нужное время и добавлять анимационный текстаг work. По отмене апгрейда, либо истечению таймера анимационный тег удаляется и создаётся воин, к которому привязывается соответствующий звук. Но есть и другие варианты, типа создавать внутри здания другое, которое реально будет производить юнитов, когда заказал апгрейд, там иная реализация. И не упомянул про затрачиваемые ресурсы. Потребуется забирать/возвращать часть ресурсов при отмене апгрейда.
На примере триггеров и фиолетовых строк в редакторе объектов смотри, как сделано улучшение Бугая в Дренорского бугая.
Конечно, мог бы сделать MUI триггер на GUI для отсутствия очереди, но это было бы громоздко и в техническом смысле уродливо. производящие здания заносились бы в массив, для которого будет массив таймеров, которые будут заноситься в виде событий на истечение таймера в другой триггер, а точнее будет несколько массивов таймеров, по максимальному числу тренируемых юнитов в любом производящем здании.
скрин скинул выше, но там ошибка. И если раскрыть, то обнаруживается еще одна утечка: на гуи Point(0,0), а на jass эта команда называется по-другому Location(0,0), эта функция создает точку
раскрыть
попробуй раскрутить, и использовать эту
native CreateItem takes integer itemid, real x, real y returns item
через CS: call CreateItem( id, GetUnitX(u), GetUnitY(u))
где id - ид-номер типа предмета, u - юнит. Ввести тип предмета, и юнита нужно.
можно еще запомнить как-то, чтобы к предмету как-то обращаться
через CS: set it = CreateItem( id, GetUnitX(u), GetUnitY(u))
где it - переменная предмета. Объявить переменную и обращаться
zontik2012 нет, не является утечкой. Если бы ты крепил эффект к точке, к примеру в позиции юнита, причем не удалял бы эту точку потом - то это была бы утечка
но условие можно переделать как угодно...например для входящего юнита в область это только пример того как записать диалог в таблицу и очищать хэндл чтобы не вызвал утечек NazarPunk:
Wc3MapAnticheatAntivirus - Сканер карт [Вирусы,Читпаки,Читы,Ники]. Автор - "Abso". Название программы вбей в гугле, там будет единственная ссылка где скачать.
Nyanta, для начала дебаг сделать как написано в статье
Сделал. Триггер работает как нужно. При входе всегда пишет "Вход!", при выходе - "Выход!". Порядок текста не меняется.
В общем, проблема, почему-то, была в названии анимации. Открыл модель через MdlVis и назвал анимации "родными" словами Stand, Walk, Death. Стало работать как надо.
Спасибо Rare за Rare:
ставь скорость анимации на 0%
И nvc123 за то, что натолкнул на мысль этим) nvc123:
Анимация кости базы при death сместилась у конечной точки в линейке анимации. Поправил. В игре потестил, работает. Рассчитать границы нужны когда делаешь новые или изменяешь старые анимации, одна из причин чтоб анимация не сместилась и была на своем месте. Но в твоем случае она сразу не помогла.
Nyanta, для начала дебаг сделать как написано в статье
Сделал. Триггер работает как нужно. При входе всегда пишет "Вход!", при выходе - "Выход!". Порядок текста не меняется.
В общем, проблема, почему-то, была в названии анимации. Открыл модель через MdlVis и назвал анимации "родными" словами Stand, Walk, Death. Стало работать как надо.
Спасибо Rare за Rare:
ставь скорость анимации на 0%
И nvc123 за то, что натолкнул на мысль этим) nvc123:
Ошибка при работе с MdlVis. Попробуй открыть модель в версии 1.40, там должно изменение видимости в ключевых кадрах должно заработать. Однако советую сделать копию модели, т.к. 1.40, если не изменяет память, ломает уже настроенную видимость.
Анимация кости базы при death сместилась у конечной точки в линейке анимации. Поправил. В игре потестил, работает. Рассчитать границы нужны когда делаешь новые или изменяешь старые анимации, одна из причин чтоб анимация не сместилась и была на своем месте. Но в твоем случае она сразу не помогла.
я так и не понял почему ты не можешь просто сделать как улучшение что не так с улучшением как в обычном случае.
дело в описании, вот и не могу так сделать,если сделать через улучшение здания, то при наведении на иконку вплывает подсказка, та же подсказка что будет и у самого здания в списке построек у светлячка, тоесть если делать через улучшение (по идее этот же юнит должен быть и в списке построек (а он там есть) ту подсказку которую я хочу будет лишней. вот пример: Древо жизни превращается в древо мира, при этом все союзные юниты вблизи древа получают повышеную регенерацию здоровья. (а теперь представь что эта подсказка будет в списке построек у светлячка, вообще не то)
Решил проблему путем выбора древа когда истекает однократный таймер, также подумал и решил что наверно лучше делать через способности, а не исследования. Но у меня остался один вопрос, если этот тригер отвечающий за применения этих способностей будет использовать несколько игроков, я не знаю будет ли использоватся оно коректно или нет, также и с отдельным триггером Таймер. Вот что вышло в данный момент:
Увы но нет... Главная особенность той карты что все герои открываются по мере накопления очков за игру на карте, они не открыты сразу и не походу первой катки открываются а лишь с накоплением общих баллов. Я весь мозг сломал уже, в попытках вспомнить. Эх...
Я пробовал через все форматы
Простите, но значения точно такие у меня. Не получилось
Да ещё я был ооочень далек от пк и озвучки, я не мог отправить данные.
Ты чувствуешь непоследовательность в своих комментариях? Что пробовал кучу форматов, а значит мог банально перепутать какие-то параметры, но уверен, что параметры именно такие, как указал, при этом ооочень далек от ПК, чтобы ещё раз перепроверить себя.
Я только 10 мин назад проверил, и посмотрел, точно так сделал как сказали (кроме таблицы) не работают, теперь сам сделаю по своему.
Я просто попросил, ничего обидного нет, с правильной точки зрения.
За идиотов нас здесь считаешь? Пришёл сюда к идиотам с вопросами.
Я никого не считаю идиотом, и даже сам попросил не судить строго, чтоб какой-то РЕАЛЬНЫЙ ИДИОТ не жаловался мне! Я создаю свои карты и мне нужны св-ва и данные для улучшения .
Может быть ты и есть идиот поскольку считаешь что я думаю плохое о других, но не остальные.
Читал, что в архиве war3patch.mpq файл UI\SoundInfo\UnitsAckSounds.slk надо взять и добавить в него новые сеты озвучки.
Ну для блока урона нужно вручать абилку на 100500 хп, лечить юнита, ну а только потом, с помощью таймера на 0.00 сек. убирать абилку и ставить хп сколько было до всего этого дела.
Могу дать свою карту, там есть и детект физ урона без мемхака и блок урона и снижение урона.
всего 1 строчку. всего 1 аргумент. с нуля на 270 поменял и все. стандартное ориентация зданий = 270 град, записана в переменную. хотел чтобы вы сами помучались. пробуй брать гуи,конвентировать в код. сравнивали. пример статьи читали бы.
Все не то. Нужна группа юнитов. При смерти юнита узнается к какой группе он принадлежал (через ХТ или структуру). Юнит удаляется из группы. Если после этого группа остается пуста - запускать таймер респавна с коллбэком. Фсе. Никаких "посмотри как в доте", просто здравый смысл.
В коллбеке же запускать рандомно одну из функций создающую стак, передавать в нее ссылку на группу и записывать в эту группу созданных юников.
quq_CCCP, у меня крипы спавнятся не из одной точки. Крипы спавнятся в лагерях. В каждом лагере есть несколько точек спавна. При каждом спавне выбирается рандомная точка спавна из рандомного лагеря. Так что с реалистичностью у меня нет проблем.
local data = {}
for _, value in pairs(Creep) do
if type(value) == "table" and value.round ~= nil then
if data[value.round] == nil then
data[value.round] = {}
end
table.insert( data[value.round], value )
end
end
for key, value in pairs(data) do
local i = math.random(1, #value)
name [key] = value[i].name
stylizedName[key] = value[i].stylizedName
tip [key] = value[i].tip
prepare [key] = value[i].prepare
count [key] = value[i].count
limit [key] = value[i].limit
spawnCamp [key] = value[i].spawnCamp
startSound [key] = value[i].startSound
endSound [key] = value[i].endSound
pool [key] = value[i].pool
BJDebugMsg('Round ' .. key .. ': ' ..name[key])
end
Да, только это. У меня карта - арена и не хочется, чтобы юниты спавнились на трибунах или за воротами. А призвать нужно 3 типа юнита.
Берёшь точку под героем, и поляркой создаёшь три точки рядом (либо одну, если это будет удобно).
Типа так
set Type[1] = 'u001'
set Type[2] = 'u002'
set Type[3] = 'u003'
set P1 = позиция кастера
Цикл А от 1 до 3
set P2 = Полярка от P1 на дистанции 40. под углом ( А * 120. )
Боевая единица - Создать 1 юнита типа Type[A] в позиции P2
очистку и удаление точек - по желанию...
Типа как у стандартных призывов
set P1 = позиция кастера
set P2 = Полярка от P1 на дистанции 200. под углом поворота кастера
Боевая единица - Создать 1 юнита типа 'u001' в позиции P2
Боевая единица - Создать 1 юнита типа 'u002' в позиции P2
Боевая единица - Создать 1 юнита типа 'u003' в позиции P2
Eternal soul,
Способ что предложил я - вы формируете БД и далее циклом пробегаетесь по массиву unit_type_string[i] и сравниваете его с вашей строкой. Если сравнение прошло успешно то по индексу unit_type[i] находите нужного юнита. Конечно конвертировать было бы более проффесионально, но это способ тоже будет работать.
8gabriel8, приоритет менять нельзя
стандартный ии использует это поле для контроля юнитов
пишем свой ии в котором вместо приоритета юзаем свою переменную которой можем задавать любое значение 8gabriel8:
Но для меня это путь в Москву через Владивосток
ну если между тобой и Москвой находится Владивосток то иначе никак(а вар3 как раз расположен за Владивостоком)
а) Создай 2 переменные-массива по типу "боевая единица" (массив - чтобы для каждого игрока, мы ведь за мультиплеер трем, прально?), назови типа MyChampion и MyChampionDummy.
б) подготовь невидимого героя-пустышку с нужной тебе иконкой, убери ману, если у чемпиона ее нет. Убери ему радиус обзора, убери галочки типа "отмечать на мини-карте" - остальные - опционально.
В дальнейшем мы будем синхронизировать пустышку и реального чемпиона, создавая видимость одной боевой единицы.
Итак, наш первый триггер:
в) Отследи первое появление чемпиона, когда это случится - создай для игрока героя-пустышку. Соответственно сделай MyChampion [number of (Owner of trained unit)]= last trained unit, следующей строчкой создай того самого героя-пустышку для (owner of trained unit) и сделай MyChampionDummy = last created unit. Теперь мы прочно связали этих чуваков. Этот же триггер запускает остальные.
г) Отслеживание здоровья. Сделай изначально выключенный цикличный триггер, там, каждые 0.3 секунды. Триггер запускается пунктом в). Каждые 0.3 секунды меняй здоровье героя (чья икона висит, надо чтобы она соответствовала, прально?) в % на здоровье самого чемпиона.
д) пропищи событие, мол, если выбирает игрок своего героя (кликая на иконку) выбирается чемпион
е) убивай героя вместе с чемпионом
ж) отключай триггеры с проверкой и выбором, пока чемпион мертв
з) не забывай обновлять переменную чемпиона с каждым новым чемпионом.
должен сразу предупредить что делать за тебя никто не будет
теперь по твоим вопросам
чтобы нельзя было кликать скрываешь, даёшь москиты, делаешь видимым
действие проиграть звук и указываешь твою фразу
выбираем всех подходящих(враги,живые) юнитов в радиусе от точки каста и создаём по дамми юниту(юнит без модели, без атаки, с москитами, с нужной способность, время жизни юнита 1 сек) для каждого подходящего юнита приказывая дамми юниту применить нужную способность в подходящего юнита
таким образом каждый дамми юнит применит нужную способность (в твоём случае корни) в 1 подходящего юнита для которого он и был создан а потом исчезнет
» WarCraft 3 / Плавающий текст, следующий над юнитом (Reforged)
» WarCraft 3 / Как создавать приказы юнитам?
» WarCraft 3 / Контроль сохранений
» WarCraft 3 / Бафф Ловчий.
» WarCraft 3 / Критическая ошибка в карте
» WarCraft 3 / Нужна иконка!
» WarCraft 3 / Вопрос по системе Save/Load
» WarCraft 3 / Проигрыш анимации
» WarCraft 3 / Проблема с эффектом
» WarCraft 3 / Смена модели героя
» WarCraft 3 / Наведение мыши на юнита
» WarCraft 3 / Атака юнита
» WarCraft 3 / Сделать один лимит у здания с другим зданием
» WarCraft 3 / Утечки памяти
» WarCraft 3 / Поиск карты
» WarCraft 3 / Проблемы с анимациями
» WarCraft 3 / Не работает триггер (исследование)
» WarCraft 3 / Помогите найти карту
» WarCraft 3 / Не работает озвучка юнита
» WarCraft 3 / Warcraft 3 1.31
» WarCraft 3 / Система Спавнов
» WarCraft 3 / Типы юнитов
» WarCraft 3 / Как определить главную характеристику героя?
» WarCraft 3 / Очень нужна помощь с триггером